#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define BUF_SIZE 1024
int main(int argc, char const *argv[])
{
	if (argc <= 2)
	{
		printf("usage: %s ip_address port_number\n", basename(argv[0]));
		return 1;
	}

	const char* ip = argv[1];
	int port = atoi(argv[2]);

	struct sockaddr_in address;
	bzero(&address, sizeof(address));
	address.sin_family = AF_INET;
	inet_pton(AF_INET, ip, &address.sin_addr);
	address.sin_port = htons(port);
	int sock = socket(PF_INET, SOCK_STREAM, 0);
	assert(sock > 0);
	int ret = bind(sock, (struct sockaddr*)&address, sizeof(address));
	assert(ret != -1);
	ret = listen(sock, 5);
	assert(ret != -1);

	struct sockaddr_in client;
	socklen_t client_addrlength = sizeof(client );
	while(1)
	{
		int connfd = accept(sock, (struct sockaddr*)&client, &client_addrlength);
		if (connfd < 0)
		{
			printf("errno is: %d\n", errno);
		}
		else
		{
		char buffer[BUF_SIZE];

		memset(buffer, '\0', BUF_SIZE);
		ret = recv(connfd, buffer, BUF_SIZE-1, 0);
		printf("got %d bytes of normal data '%s'\n", ret, buffer);

		memset(buffer, '\0', BUF_SIZE);
		ret = recv(connfd, buffer, BUF_SIZE-1, MSG_OOB);
		printf("got %d bytes of normal data '%s'\n", ret, buffer);

		//memset(buffer, '\0', BUF_SIZE);
		//ret = recv(connfd, buffer, BUF_SIZE-1, 0);
		//printf("got %d bytes of normal data '%s'\n", ret, buffer);

		const char* normal_data = "HTTP/1.1 200 OK\nServer: bfe/1.0.8.3\nDate: Tue, 26 May 2015 06:43:19 GMT\nContent-Type: text/html\n\n<html><head><title>Test</title></head><body><p>body Test</p></body></html>";
		send(connfd, normal_data, strlen(normal_data), 0);

		close(connfd);
	}
	}
	

	close(sock);
	return 0;
}
